# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复
# 注意事项：该函数适配的仍旧不完善，请将 您的.apsim后缀文件和所有R可执行文件放在同级目录，否则会出现路径找不到的问题。后续该问题会修复

# 注意事项：如果使用source的方式，建议使用绝对路径来引入，举例：source("/root/apsim_classic_adaptForLinux.R")，这样可以确保引入不会报错
# 注意事项：如果使用source的方式，建议使用绝对路径来引入，举例：source("/root/apsim_classic_adaptForLinux.R")，这样可以确保引入不会报错
# 注意事项：如果使用source的方式，建议使用绝对路径来引入，举例：source("/root/apsim_classic_adaptForLinux.R")，这样可以确保引入不会报错

# 使用说明：1 将该文件直接复制到 /root 目录下，然后R中的代码会使用绝对路径引入该文件。source("/root/apsim_classic_adaptForLinux.R")。
# 使用说明：2 然后修改下文的ada的路径部分，利用mono来执行Apsim.exe（改成你自己的Apsim.exe路径）。举例：ada <- "mono /root/APSIMClassic/Model/Apsim.exe 

.find_output_names <- function(.file, .src.dir = "."){

  .apsim_xml <- xml2::read_xml(paste0(.src.dir,"/",.file))

  .find.output <- xml2::xml_find_all(.apsim_xml, ".//outputfile/filename")

  .ans <- xml2::xml_text(.find.output)

  return(.ans)
}

apsim <- function (file = "", src.dir = ".", silent = FALSE, value = c("report", 
    "all", "none"), cleanup = FALSE, simplify = TRUE, apsimLocation = "")  {
    
    value <- match.arg(value)
    if (file == "") 
        stop("need to specify file name")
    # .check_apsim_name(.file = file)
    # .check_apsim_name(.file = src.dir)
    if (src.dir != ".") 
        stop("In APSIM Classic you can only run a file from the current directory.")
    file.names <- dir(path = src.dir, pattern = ".apsim$", ignore.case = TRUE)
    print(paste("file.names:",file.names))
    if (length(file.names) == 0) {
        stop("There are no .apsim files in the specified directory to run.")
    }
    file <- match.arg(file, file.names, several.ok = FALSE)
    file.name.path <- file.path(src.dir, file)
    # 重要！在linux环境下，借助mono执行命令，执行Apsim.exe
    # 举例： ada <- "sudo mono /root/APSIMClassic/Model/Apsim.exe " 
    # (有些容器默认就是root，那么就去掉sudo。) ada <- "mono /root/APSIMClassic/Model/Apsim.exe " 
    # ada <- paste(apsimLocation," ")
    ada <- "mono /root/APSIMClassic/Model/Apsim.exe "
    run.strng <- paste0(ada, " ", src.dir, "/", file)
    # 实际执行命令
    print(paste("Actual execution of commands:",run.strng))
    # 使用system执行命令：
    system(command = run.strng,  intern = TRUE)
    output.names <- .find_output_names(.file = file, .src.dir = src.dir)
    if (value != "none") {
        if (length(output.names) == 1) {
            ans <- read_apsim(file = output.names, src.dir = src.dir, 
                value = value)
        }
        else {
            ans <- read_apsim_all(filenames = output.names, src.dir = src.dir, 
                value = "report", simplify = simplify)
        }
    }
    else {
        if (value == "none" && !silent) {
            cat("APSIM created .out files, but nothing is returned \n")
        }
    }
    if (cleanup) {
        if (value == "none") 
            stop("do not clean up if you choose value = 'none' ")
        for (i in seq_along(output.names)) {
            file.remove(output.names[i])
            file.remove(sub("out$", "sum", output.names[i]))
        }
    }
    if (value != "none") 
        return(ans)
  }
